package tankgame5;

import java.util.Vector;

public class Enemy extends Tank implements Runnable{
    Vector<Shot> shots =new Vector<>();//一个坦克的多个子弹
    Vector<Enemy> enemies = new Vector<>();

    boolean isLive=true;

    public Enemy(int x, int y) {
        super(x, y);
    }

    public void setEnemies(Vector<Enemy> enemies) {
        this.enemies = enemies;
    }

    //判断敌人坦克是否重叠
    public boolean isTouchEnemy(){
        switch (getDirect()){
            case 0://up  （我上，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if(enemy != this){  //不和自己比
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我上，敌方上下情况)
                        if(enemy.getDirect() == 0 || enemy.getDirect() ==2){
                            //我方坦克
                            //左上角：[this.getX(),this.getY()]
                            //1.this的左上的点在其他坦克的范围里
                            if(this.getX() >= enemy.getX()
                                && this.getX() <=enemy.getX()+40
                                    && this.getY() >=enemy.getY()
                                        &&this.getY() <= enemy.getY()+60){
                                return  true;
                            }

                            //右上角：【this.getX()+40,this.getY()】
                            //2.右上角左边在其他坦克的区域
                            if(this.getX()+40 >= enemy.getX()
                                    && this.getX()+40 <=enemy.getX()+40
                                    && this.getY() >=enemy.getY()
                                    &&this.getY() <= enemy.getY()+60){
                                return  true;
                            }
                        }//if   (我上，敌方上下情况)

                        //(我上，敌方左右情况)
                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        else if(enemy.getDirect() == 1 || enemy.getDirect() ==3){
                            if(this.getX() >= enemy.getX()
                                    && this.getX() <=enemy.getX()+60
                                    && this.getY() >=enemy.getY()
                                    &&this.getY() <= enemy.getY()+40){
                                return  true;
                            }

                            //右上角：【this.getX()+40,this.getY()】
                            //2.右上角左边在其他坦克的区域
                            if(this.getX()+40 >= enemy.getX()
                                    && this.getX()+40 <=enemy.getX()+60
                                    && this.getY() >=enemy.getY()
                                    &&this.getY() <= enemy.getY()+40){
                                return  true;
                            }

                        }
                    }
                }//for

                break;
            case 1://right  （我右，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if(enemy != this){
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我右，敌方上下情况)
                        if(enemy.getDirect() == 0 || enemy.getDirect() ==2){
                            //我方坦克
                            //右上角：[this.getX()+60 ,this.getY()]
                            //1.this的右上点在其他坦克的范围里
                            if(this.getX() +60 > enemy.getX()
                                    && this.getX() +60 <enemy.getX()+40
                                    && this.getY() > enemy.getY()
                                    &&this.getY() < enemy.getY()+60){
                                return  true;
                            }

                            //右下角：【this.getX()+60,this.getY()+40】
                            //2.右下角在其他坦克的区域
                            if(this.getX()+60 > enemy.getX()
                                    && this.getX()+60 <enemy.getX()+40
                                    && this.getY() +40>enemy.getY()
                                    &&this.getY()+40 < enemy.getY()+60){
                                return  true;
                            }
                        }//if   (我上，敌方上下情况)

                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        //1,我右上：【getX()+60 , getY()】
                        //(我右，敌方左右情况)
                        else if(enemy.getDirect() == 1 || enemy.getDirect() ==3){
                            if(this.getX() +60>= enemy.getX()
                                    && this.getX() +60<=enemy.getX()+60
                                    && this.getY() >=enemy.getY()
                                    &&this.getY() <= enemy.getY()+40){
                                return  true;
                            }

                            //右下角：【this.getX()+60,this.getY()+40】
                            //2.右下角左边在其他坦克的区域
                            if(this.getX()+60 >= enemy.getX()
                                    && this.getX()+60 <=enemy.getX()+60
                                    && this.getY() +40>=enemy.getY()
                                    &&this.getY() +40<= enemy.getY()+40){
                                return  true;
                            }

                        }
                    }
                }//for
                break;
            case 2://down （我下，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if(enemy != this){
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我下，敌方上下情况)
                        if(enemy.getDirect() == 0 || enemy.getDirect() ==2){
                            //我方坦克
                            //左下角：[this.getX() ,this.getY()+60]
                            //1.this的右上点在其他坦克的范围里
                            if(this.getX()  > enemy.getX()
                                    && this.getX()  <enemy.getX()+40
                                    && this.getY()+60 > enemy.getY()
                                    &&this.getY()+60 < enemy.getY()+60){
                                return  true;
                            }

                            //右下角：【this.getX()+40,this.getY()+60】
                            //2.右下角在其他坦克的区域
                            if(this.getX()+40 > enemy.getX()
                                    && this.getX()+40 <enemy.getX()+40
                                    && this.getY() +60>enemy.getY()
                                    &&this.getY()+60 < enemy.getY()+60){
                                return  true;
                            }
                        }//if

                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        //左下角：[this.getX() ,this.getY()+60]
                        //(我下，敌方左右情况)
                        //1,左下点判断
                        else if(enemy.getDirect() == 1 || enemy.getDirect() ==3){
                            if(this.getX()>= enemy.getX()
                                    && this.getX() <=enemy.getX()+60
                                    && this.getY()+60 >=enemy.getY()
                                    &&this.getY()+60 <= enemy.getY()+40){
                                return  true;
                            }

                            //右下角：【this.getX()+40,this.getY()+60】
                            //2.右下点判断
                            if(this.getX()+40 >= enemy.getX()
                                    && this.getX()+40 <=enemy.getX()+60
                                    && this.getY() +60>=enemy.getY()
                                    &&this.getY() +60<= enemy.getY()+40){
                                return  true;
                            }
                        }
                    }
                }//for
                break;
            case 3://left（我左，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if(enemy != this){
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我左，敌方上下情况)
                        if(enemy.getDirect() == 0 || enemy.getDirect() ==2){
                            //我方坦克
                            //左上角：[this.getX() ,this.getY()]
                            //1.this的右上点在其他坦克的范围里
                            if(this.getX()  > enemy.getX()
                                    && this.getX()  <enemy.getX()+40
                                    && this.getY() > enemy.getY()
                                    &&this.getY() < enemy.getY()+60){
                                return  true;
                            }

                            //左下角：【this.getX(),this.getY()+40】
                            //2.左下角在其他坦克的区域
                            if(this.getX() > enemy.getX()
                                    && this.getX() <enemy.getX()+40
                                    && this.getY() +40 >enemy.getY()
                                    &&this.getY()+40 < enemy.getY()+60){
                                return  true;
                            }
                        }//if

                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        //左下角：[this.getX() ,this.getY()+60]
                        //(我左，敌方左右情况)
                        //左上角：[this.getX() ,this.getY()]
                        //1,左上点判断
                        else if(enemy.getDirect() == 1 || enemy.getDirect() ==3){
                            if(this.getX()>= enemy.getX()
                                    && this.getX() <=enemy.getX()+60
                                    && this.getY() >=enemy.getY()
                                    &&this.getY() <= enemy.getY()+40){
                                return  true;
                            }

                            //左下角：【this.getX(),this.getY()+40】
                            //2.左下点判断
                            if(this.getX() >= enemy.getX()
                                    && this.getX() <=enemy.getX()+60
                                    && this.getY() +40>=enemy.getY()
                                    &&this.getY() +40<= enemy.getY()+40){
                                return  true;
                            }
                        }
                    }
                }//for
                break;
        }//switch
        return false;//没有在碰撞代码里返回
    }

    @Override
    public void run() {
        while (true){
            Shot s =null;
            //敌人坦克能发射很多子弹
            if(isLive && shots.size() < 3){
                switch (getDirect()){
                    case 0:
                        s = new Shot(getX()+20,getY(),0);
                        break;
                    case 1:
                        s = new Shot(getX()+60,getY()+20,1);
                        break;
                    case 2:
                        s = new Shot(getX()+20,getY()+60,2);
                        break;
                    case 3:
                        s = new Shot(getX()+20,getY()+20,3);
                        break;
                }
                shots.add(s);
                //启动
                new Thread(s).start();
            }

        //沿着本来的方向，较缓慢的移动
        switch (getDirect()){
            case 0:
                for (int i = 0; i < 30; i++) {
                    if (getY()>0 && !isTouchEnemy()){//加上功能：敌人坦克不能重叠
                        moveUp();
                    }
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case 1:
                for (int i = 0; i < 30; i++) {
                    if (getX()+60<1000 && !isTouchEnemy())
                    moveRight();
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case 2:
                for (int i = 0; i < 30; i++) {
                    if(getY()+60<650 && !isTouchEnemy())
                moveDown();
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
                break;
            case 3:
                for (int i = 0; i < 30; i++) {
                    if (getX()>0 && !isTouchEnemy())
                    moveLeft();
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                break;

        }//switch

        //随机转变方向(0-3)
        setDirect((int)(Math.random()*4));
        //退出这一个地方坦克线程
        if(!isLive){
            break;
        }
        }//while
    }//run
}
